home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Przegladarki internetowe / Mozilla Seamonkey 1.0.5 pl / seamonkey-1.0.5.pl-PL.win32.installer.exe / MAIL.XPI / bin / chrome / messenger.jar / content / messenger / subscribe.js < prev    next >
Encoding:
Text File  |  2005-07-20  |  14.4 KB  |  536 lines

  1. var gSubscribeTree = null;
  2. var gSearchTree;
  3. var okCallback = null;
  4. var gChangeTable = {};
  5. var gServerURI = null;
  6. var gSubscribableServer = null;
  7. var gStatusBar = null;
  8. var gNameField = null;
  9. var gNameFieldLabel = null;
  10. var gFolderDelimiter = ".";
  11. var gStatusFeedback = new nsMsgStatusFeedback;
  12. var gTimelineEnabled = false;
  13. var gMessengerBundle = null;
  14. var gSubscribeDeck = null;
  15. var gSearchView = null;
  16. var gSearchTreeBoxObject = null;
  17. // the rdf service
  18. var RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService);
  19. var subscribeDS = RDF.GetDataSource("rdf:subscribe");
  20.  
  21. // get the "subscribed" atom
  22. var atomService = Components.classes["@mozilla.org/atom-service;1"].getService().QueryInterface(Components.interfaces.nsIAtomService);
  23. var gSubscribedAtom = atomService.getAtom("subscribed").QueryInterface(Components.interfaces.nsISupports);
  24.  
  25. var gSubscribeBundle;
  26.  
  27. function goDoCommand()
  28. {
  29. }
  30.  
  31. function Stop()
  32. {
  33.     //dump("Stop()\n")
  34.     if (gSubscribableServer) {
  35.         gSubscribableServer.stopPopulating(msgWindow);
  36.     }
  37. }
  38.  
  39. function SetServerTypeSpecificTextValues()
  40. {
  41.     if (!gServerURI) return;
  42.  
  43.     var serverType = GetMsgFolderFromUri(gServerURI, true).server.type;
  44.  
  45.     // set the server specific ui elements
  46.     var stringName = "foldersheaderfor-" + serverType;
  47.     var stringval = gSubscribeBundle.getString(stringName);
  48.     var element = document.getElementById("nameColumn");
  49.     element.setAttribute('label',stringval);
  50.     element = document.getElementById("nameColumn2");
  51.     element.setAttribute('label',stringval);
  52.  
  53.     //set the delimiter
  54.     try {
  55.         gFolderDelimiter = gSubscribableServer.delimiter;
  56.     }
  57.     catch (ex) {
  58.         //dump(ex + "\n");
  59.         gFolderDelimiter = ".";
  60.     }
  61. }
  62.  
  63. function onServerClick(event)
  64. {
  65.     var item = event.target;
  66.     gServerURI = item.id;
  67.     //dump("gServerURI="+gServerURI+"\n");
  68.  
  69.     SetUpTree(false);
  70.  
  71.     SetServerTypeSpecificTextValues();
  72. }
  73.  
  74. function SetUpServerMenu()
  75. {
  76.     //dump("SetUpServerMenu()\n");
  77.  
  78.     var serverMenu = document.getElementById("serverMenu");
  79.     var menuitems = serverMenu.getElementsByAttribute("id", gServerURI);
  80.  
  81.     try {
  82.         //dump("gServerURI="+gServerURI+"\n");
  83.         //dump("menuitems="+menuitems+"\n");
  84.         //dump("menuitems[0]="+menuitems[0]+"\n");
  85.         //dump("serverMenu="+serverMenu+"\n");
  86.         serverMenu.selectedItem = menuitems[0];
  87.     }
  88.     catch (ex) {
  89.         //dump("failed to set the selected server: " + ex + "\n");
  90.     }
  91.  
  92.     SetServerTypeSpecificTextValues();
  93. }
  94.  
  95. var MySubscribeListener = {
  96.     OnDonePopulating: function() {
  97.         gStatusFeedback._stopMeteors();
  98.  
  99.         // only re-root the tree, if it is null.
  100.         // otherwise, we are in here because we are populating
  101.         // a part of the tree
  102.   
  103.         var refValue = gSubscribeTree.getAttribute('ref');
  104.         if (!refValue) {
  105.             //dump("root subscribe tree at: "+ gServerURI +"\n");
  106.             gSubscribeTree.database.AddDataSource(subscribeDS);
  107.             gSubscribeTree.setAttribute('ref',gServerURI);
  108.         }
  109.     }
  110. };
  111.  
  112. function SetUpTree(forceToServer)
  113. {
  114.     //dump("SetUpTree()\n");
  115.     
  116.     gStatusBar = document.getElementById('statusbar-icon');
  117.     if (!gServerURI) return;
  118.  
  119.     var folder = GetMsgFolderFromUri(gServerURI, true);
  120.     var server = folder.server;
  121.  
  122.     try {
  123.           CleanUpSearchView();
  124.           gSubscribableServer = server.QueryInterface(Components.interfaces.nsISubscribableServer);
  125.           gSubscribeTree.setAttribute('ref',null);
  126.  
  127.           // enable (or disable) the search related UI
  128.           EnableSearchUI();
  129.  
  130.           // clear out the text field when switching server
  131.           gNameField.value = "";
  132.  
  133.           // since there is no text, switch to the non-search view...
  134.           SwitchToNormalView();
  135.  
  136.           gSubscribeTree.database.RemoveDataSource(subscribeDS);
  137.           gSubscribableServer.subscribeListener = MySubscribeListener;
  138.  
  139.           gStatusFeedback._startMeteors();
  140.           gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
  141.  
  142.           gSubscribableServer.startPopulating(msgWindow, forceToServer);
  143.     }
  144.     catch (ex) {
  145.           //dump("failed to populate subscribe ds: " + ex + "\n");
  146.     }
  147. }
  148.  
  149.  
  150. function SubscribeOnUnload()
  151. {
  152.   try {
  153.     CleanUpSearchView();
  154.     gSubscribeTree.database.RemoveDataSource(subscribeDS);
  155.   }
  156.   catch (ex) {
  157.     dump("failed to remove the subscribe ds: " + ex + "\n");
  158.   }
  159. }
  160.  
  161. function EnableSearchUI()
  162. {
  163.   if (gSubscribableServer.supportsSubscribeSearch) {
  164.     gNameField.removeAttribute('disabled');
  165.     gNameFieldLabel.removeAttribute('disabled');
  166.   }
  167.   else {
  168.     gNameField.setAttribute('disabled',true);
  169.     gNameFieldLabel.setAttribute('disabled',true);
  170.   }
  171. }
  172.  
  173. function SubscribeOnLoad()
  174. {
  175.   //dump("SubscribeOnLoad()\n");
  176.   gSubscribeBundle = document.getElementById("bundle_subscribe");
  177.   gMessengerBundle = document.getElementById("bundle_messenger");
  178.     
  179.   gSubscribeTree = document.getElementById("subscribeTree");
  180.   gSearchTree = document.getElementById("searchTree");
  181.   gSearchTreeBoxObject = document.getElementById("searchTree").treeBoxObject;
  182.   gNameField = document.getElementById("namefield");
  183.   gNameFieldLabel = document.getElementById("namefieldlabel");
  184.  
  185.   gSubscribeDeck = document.getElementById("subscribedeck");
  186.  
  187.   msgWindow = Components.classes[msgWindowContractID].createInstance(Components.interfaces.nsIMsgWindow);
  188.   msgWindow.statusFeedback = gStatusFeedback;
  189.   msgWindow.SetDOMWindow(window);
  190.   msgWindow.rootDocShell.allowAuth = true;
  191.  
  192.     // look in arguments[0] for parameters
  193.     if (window.arguments && window.arguments[0]) {
  194.         if ( window.arguments[0].okCallback ) {
  195.             top.okCallback = window.arguments[0].okCallback;
  196.         }
  197.     }
  198.     
  199.     gServerURI = null;
  200.     if (window.arguments[0].preselectedURI) {
  201.         var uri = window.arguments[0].preselectedURI;
  202.         //dump("subscribe: got a uri," + uri + "\n");
  203.         var folder = GetMsgFolderFromUri(uri, true);
  204.         //dump("folder="+folder+"\n");
  205.         //dump("folder.server="+folder.server+"\n");
  206.         try {
  207.                         CleanUpSearchView();
  208.             gSubscribableServer = folder.server.QueryInterface(Components.interfaces.nsISubscribableServer);
  209.                         // enable (or disable) the search related UI
  210.                         EnableSearchUI();
  211.             gServerURI = folder.server.serverURI;
  212.         }
  213.         catch (ex) {
  214.             //dump("not a subscribable server\n");
  215.                         CleanUpSearchView();
  216.             gSubscribableServer = null;
  217.             gServerURI = null;
  218.         }
  219.     }
  220.  
  221.     if (!gServerURI) {
  222.         //dump("subscribe: no uri\n");
  223.         //dump("xxx todo:  use the default news server.  right now, I'm just using the first server\n");
  224.         var serverMenu = document.getElementById("serverMenu");
  225.         var menuitems = serverMenu.getElementsByTagName("menuitem");
  226.         
  227.         if (menuitems.length > 1) {
  228.             gServerURI = menuitems[1].id;
  229.         }
  230.         else {
  231.             //dump("xxx todo none of your servers are subscribable\n");
  232.             //dump("xxx todo fix this by disabling subscribe if no subscribable server or, add a CREATE SERVER button, like in 4.x\n");
  233.             return;
  234.         }
  235.     }
  236.  
  237.     SetUpServerMenu();
  238.  
  239.   SetUpTree(false);
  240.  
  241.   gNameField.focus();
  242. }
  243.  
  244. function subscribeOK()
  245. {
  246.     //dump("in subscribeOK()\n")
  247.     if (top.okCallback) {
  248.         top.okCallback(top.gChangeTable);
  249.     }
  250.     Stop();
  251.     if (gSubscribableServer) {
  252.         gSubscribableServer.subscribeCleanup();
  253.     }
  254.     return true;
  255. }
  256.  
  257. function subscribeCancel()
  258. {
  259.   Stop();
  260.   if (gSubscribableServer) {
  261.     gSubscribableServer.subscribeCleanup();
  262.   }
  263.   return true;
  264. }
  265.  
  266. function SetState(name,state)
  267. {
  268.   var changed = gSubscribableServer.setState(name, state);
  269.   if (changed)
  270.     StateChanged(name,state);
  271. }
  272.  
  273. function changeTableRecord(server, name, state) 
  274. {
  275.   this.server = server;
  276.   this.name = name;
  277.   this.state = state;
  278. }
  279.  
  280. function StateChanged(name,state)
  281. {
  282.   if (gServerURI in gChangeTable) {
  283.     if (name in gChangeTable[gServerURI]) {
  284.       var oldValue = gChangeTable[gServerURI][name];
  285.       if (oldValue != state)
  286.         delete gChangeTable[gServerURI][name];
  287.     }
  288.     else {
  289.       gChangeTable[gServerURI][name] = state;
  290.     }
  291.   }
  292.   else {
  293.     gChangeTable[gServerURI] = {};
  294.     gChangeTable[gServerURI][name] = state;
  295.   }
  296. }
  297.  
  298. function InSearchMode()
  299. {
  300.     // search is the second card in the deck
  301.     return (gSubscribeDeck.getAttribute("selectedIndex") == "1");
  302. }
  303.  
  304. function SearchOnClick(event)
  305. {
  306.   // we only care about button 0 (left click) events
  307.   if (event.button != 0 || event.originalTarget.localName != "treechildren") return;
  308.  
  309.   var row = {}, col = {}, childElt = {};
  310.   gSearchTreeBoxObject.getCellAt(event.clientX, event.clientY, row, col, childElt);
  311.   if (row.value == -1 || row.value > gSearchView.rowCount-1)
  312.     return;
  313.  
  314.   if (col.value.id == "subscribedColumn2") {
  315.     if (event.detail != 2) {
  316.       // single clicked on the check box 
  317.       // (in the "subscribedColumn2" column) reverse state
  318.       // if double click, do nothing
  319.       ReverseStateFromRow(row.value);
  320.     }
  321.   } else if (event.detail == 2) {
  322.     // double clicked on a row, reverse state
  323.     ReverseStateFromRow(row.value);
  324.   }
  325.  
  326.   // invalidate the row
  327.   InvalidateSearchTreeRow(row.value);
  328. }
  329.  
  330. function ReverseStateFromRow(row)
  331. {
  332.     // to determine if the row is subscribed or not,
  333.     // we get the properties for the "subscribedColumn2" cell in the row
  334.     // and look for the "subscribed" property
  335.     // if the "subscribed" atom is in the list of properties
  336.     // we are subscribed
  337.     var properties = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  338.     var col = gSearchTree.columns["subscribedColumn2"];
  339.     gSearchView.getCellProperties(row, col, properties);
  340.  
  341.     var isSubscribed = (properties.GetIndexOf(gSubscribedAtom) != -1);
  342.     SetStateFromRow(row, !isSubscribed);
  343. }
  344.  
  345. function SetStateFromRow(row, state)
  346. {
  347.     var col = gSearchTree.columns["nameColumn2"];
  348.     var name = gSearchView.getCellText(row, col);
  349.  
  350.     SetState(name, state);
  351. }
  352.  
  353. function SetSubscribeState(state)
  354. {
  355.   try {
  356.     // we need to iterate over the tree selection, and set the state for 
  357.     // all rows in the selection
  358.     var inSearchMode = InSearchMode();
  359.     var view = inSearchMode ? gSearchView : gSubscribeTree.view;
  360.     var colId = inSearchMode ? "nameColumn2" : "nameColumn";
  361.     
  362.     var sel = view.selection;
  363.     for (var i = 0; i < sel.getRangeCount(); ++i) {
  364.       var start = {}, end = {};
  365.       sel.getRangeAt(i, start, end);
  366.       for (var k = start.value; k <= end.value; ++k) {
  367.         if (inSearchMode)
  368.           SetStateFromRow(k, state);
  369.         else {
  370.           var rowRes = gSubscribeTree.builderView.getResourceAtIndex(k);
  371.           var name = GetRDFProperty(rowRes, "Name");
  372.           SetState(name, state);
  373.         }
  374.       }
  375.     }
  376.     
  377.     if (inSearchMode) {
  378.       // force a repaint
  379.       InvalidateSearchTree();
  380.     }
  381.   }
  382.   catch (ex) {
  383.     dump("SetSubscribedState failed:  " + ex + "\n");
  384.   }
  385. }
  386.  
  387. function ReverseStateFromNode(row)
  388. {
  389.   var rowRes = gSubscribeTree.builderView.getResourceAtIndex(row);
  390.   var isSubscribed = GetRDFProperty(rowRes, "Subscribed");
  391.   var name = GetRDFProperty(rowRes, "Name");
  392.  
  393.   SetState(name, isSubscribed != "true");
  394. }
  395.  
  396. function GetRDFProperty(aRes, aProp)
  397. {
  398.   var propRes = RDF.GetResource("http://home.netscape.com/NC-rdf#"+aProp);
  399.   var valueRes = gSubscribeTree.database.GetTarget(aRes, propRes, true);
  400.   return valueRes ? valueRes.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : null;
  401. }
  402.  
  403. function SubscribeOnClick(event)
  404. {
  405.   // we only care about button 0 (left click) events
  406.   if (event.button != 0 || event.originalTarget.localName != "treechildren")
  407.    return;
  408.  
  409.   var row = {}, col = {}, obj = {};
  410.   gSubscribeTree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
  411.   if (row.value == -1 || row.value > (gSubscribeTree.view.rowCount - 1))
  412.     return;
  413.  
  414.   if (event.detail == 2) {
  415.     // only toggle subscribed state when double clicking something
  416.     // that isn't a container
  417.     if (!gSubscribeTree.view.isContainer(row.value)) {
  418.       ReverseStateFromNode(row.value);
  419.       return;
  420.     } 
  421.   }
  422.   else if (event.detail == 1)
  423.   {
  424.     if (obj.value == "twisty") {
  425.         if (gSubscribeTree.view.isContainerOpen(row.value)) {
  426.           var uri = gSubscribeTree.builderView.getResourceAtIndex(row.value).Value;
  427.  
  428.           gStatusFeedback._startMeteors();
  429.           gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
  430.  
  431.           gSubscribableServer.startPopulatingWithUri(msgWindow, true /* force to server */, uri);
  432.         }
  433.     }
  434.     else {
  435.       // if the user single clicks on the subscribe check box, we handle it here
  436.       if (col.value.id == "subscribedColumn")
  437.         ReverseStateFromNode(row.value);
  438.     }
  439.   }
  440. }
  441.  
  442. function Refresh()
  443. {
  444.         // clear out the textfield's entry on call of Refresh()
  445.         gNameField.value = "";
  446.         // force it to talk to the server
  447.         SetUpTree(true);
  448. }
  449.  
  450. function InvalidateSearchTreeRow(row)
  451. {
  452.     gSearchTreeBoxObject.invalidateRow(row);
  453. }
  454.  
  455. function InvalidateSearchTree()
  456. {
  457.     gSearchTreeBoxObject.invalidate();
  458. }
  459.  
  460. function SwitchToNormalView()
  461. {
  462.   // the first card in the deck is the "normal" view
  463.   gSubscribeDeck.setAttribute("selectedIndex","0");
  464. }
  465.  
  466. function SwitchToSearchView()
  467. {
  468.   // the second card in the deck is the "search" view
  469.   gSubscribeDeck.setAttribute("selectedIndex","1");
  470. }
  471.  
  472. function Search()
  473. {
  474.   var searchValue = gNameField.value;
  475.   if (searchValue.length && gSubscribableServer.supportsSubscribeSearch) {
  476.     SwitchToSearchView();
  477.     gSubscribableServer.setSearchValue(searchValue);
  478.  
  479.     if (!gSearchView && gSubscribableServer) {
  480.     gSearchView = gSubscribableServer.QueryInterface(Components.interfaces.nsITreeView);
  481.       gSearchView.selection = null;
  482.     gSearchTreeBoxObject.view = gSearchView;
  483.   }
  484.   }
  485.   else {
  486.     SwitchToNormalView();
  487.   }
  488. }
  489.  
  490. function CleanUpSearchView()
  491. {
  492.   if (gSearchView) {
  493.     gSearchView.selection = null;
  494.     gSearchView = null;
  495.   }
  496. }
  497.  
  498. function onSearchTreeKeyPress(event)
  499. {
  500.   // for now, only do something on space key
  501.   if (event.charCode != KeyEvent.DOM_VK_SPACE)
  502.     return;
  503.  
  504.   var treeSelection = gSearchView.selection; 
  505.   for (var i=0;i<treeSelection.getRangeCount();i++) {
  506.     var start = {}, end = {};
  507.     treeSelection.getRangeAt(i,start,end);
  508.     for (var k=start.value;k<=end.value;k++)
  509.       ReverseStateFromRow(k);
  510.  
  511.     // force a repaint
  512.     InvalidateSearchTree();
  513.   }
  514. }
  515.  
  516. function onSubscribeTreeKeyPress(event)
  517. {
  518.   // for now, only do something on space key
  519.   if (event.charCode != KeyEvent.DOM_VK_SPACE)
  520.     return;
  521.  
  522.   var treeSelection = gSubscribeTree.view.selection; 
  523.   for (var i=0;i<treeSelection.getRangeCount();i++) {
  524.     var start = {}, end = {};
  525.     treeSelection.getRangeAt(i,start,end);
  526.     for (var k=start.value;k<=end.value;k++)
  527.       ReverseStateFromNode(k);
  528.   }
  529. }
  530.  
  531.  
  532. function doHelpButton() 
  533. {
  534.   openHelp("mail-subscribe");
  535. }
  536.